﻿//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
// C语言中定义一个自定义的结构体，关键字为 struct
// 结构体前面可以定义一些变量，这些变量都是结构体的成员

#include "common.h"

struct Stu
    // 定义学生的结构体
{
    // 成员
    char name[50];
    char sex[10];
    int age;
    char phone[20];
    char introduce[1000];
}; // 结构体的结束标记

void printp(struct Stu* ps) // 定义一个函数，参数为结构体指针
{ // 函数的开始标记
    // 输出 Stu 类型结构体的成员信息
    printf("学生的个人信息:\t%s\t%s\t%d\t%s\t%s\n", (*ps).name, (*ps).sex,
        (*ps).age, (*ps).phone, (*ps).introduce); // 输出成员的方式之一
    // 指针->成员方式输出
    printf("学生的个人信息:\t%s\t%s\t%d\t%s\t%s\n", ps->name, ps->sex,
        ps->age, ps->phone, ps->introduce); // 方式相同
}

void study14()
{
    int a = 10;
    //&a; // 取地址
    int* p = &a;  // 将a的地址赋值给指针变量p时，p为指向int类型的指针，即p指向的变量是int型的
    printf("a的地址是:%p\n", p);  // %p 用于打印地址，打印值的格式为 16 进制表示
    //说明：内存元素都是按字节存放的，因此一个变量的地址也是一个指针，指针指向的地址也是一个变量的地址
    *p = 20; // 通过指针p修改指向的地址里的值，即变量a的值
    //指 *p 是 p 指向的变量的值，这里相当于 a
    printf("a的值现在是:%d\n", a);

    printf("int指针的大小是:%zd\n", sizeof(int*)); // 输出 zd 代表 zsize 也可以
    printf("char指针的大小是:%zd\n", sizeof(char*));
    printf("long指针的大小是:%zd\n", sizeof(long*));
    printf("short指针的大小是:%zd\n", sizeof(short*));
    printf("double指针的大小是:%zd\n", sizeof(double*));
    // 说明：各种指针类型的大小都是相同的，一个指针类型的大小就是地址的大小，32 位系统地址为 32 位也即 4 字节
    // 同时 64 位系统的地址为 64 bit 也即 8 byte，所以这里的结果是 8 字节的意思
    // 同时也可以看出 x64 系统是 64 位的，也就是说指针是 64 位的

    char c1 = 'a';
    char c2 = 'b';
    char c3 = 'c';
    char c4 = 'd';
    char c5 = 'e';
    char c6 = 'f';
    char* p1 = &c1;
    char* p2 = &c2;
    char* p3 = &c3;
    char* p4 = &c4;
    char* p5 = &c5;
    char* p6 = &c6;
    printf("p1到p6的值为:%p\t%p\t%p\t%p\t%p\t%p\n", p1, p2, p3, p4, p5, p6);
    //printf("p1到p6的值为:%zd\t%zd\t%zd\t%zd\t%zd\t%zd\n", p1, p2, p3, p4, p5, p6);
    //说明：在64位系统中，p1 到 p6 的地址值是连续的，每个地址之间相差一个字节（4个指针地址相差4字节）

    // 定义结构体 Stu 
    struct Stu s1 = { "小明", "男", 18, "14383838438", "这是一个学生" };
    printf("学生s1的信息:\t%s\t%s\t%s\t%d\t%s\n", s1.name, s1.sex, s1.introduce,
        s1.age, s1.phone);
    printp(&s1); // 调用输出指针的内容，注意指针的地址才能获取成员地址
    //return 0;
}
